Работа с индексами¶
TCS поддерживает два типа индексов:
Индексы key-value¶
Особенности индексов key-value в TCS¶
Индексы key-value создаются пустыми и наполняются по мере вставки новых данных.
Этот вид индексов работает только для запросов на равенство значений. Запросы на сравнение значений (больше/меньше) пока не поддерживаются.
Индексы key-value работают в режиме оптимизированного индексирования,
при котором во вторичные индексы не добавляются записи со значением null в индексируемом поле.
За счет этого индексы не хранят отфильтрованные записи, поэтому индексирование выполняется быстрее.
Также это позволяет повысить производительность обновления индексов в TCS.
Создание индекса key-value¶
Чтобы построить индекс key-value для некоторой колонки, в конфигурации данных для данной колонки нужно указать следующие параметры:
(обязательно) indexed со значением
true,(необязательно) index_depth со значением
nullили строго больше0.
Например, здесь key-value индекс построен по первой колонке (id):
# tcs.yml
tcs:
block_size: 1024
default_column_values_limit: 20000
schema:
db:
public:
users:
columns:
- data_type: utf8
column_values_limit: 10000
name: id
index_depth: 10000
indexed: true
- data_type: utf8
column_values_limit: 1000
name: username
indexed: false
Удаление индекса key-value¶
Чтобы удалить индекс key-value, в конфигурации данных
для соответствующей индексу колонки нужно указать параметр indexed: false.
После применения конфигурации индекс будет удален, а запросы на равенство значений будут производиться не по индексу.
Изменение глубины индекса key-value¶
Изменять глубину индекса можно с помощью параметра index_depth в конфигурации данных
для соответствующей индексу колонки:
при уменьшении значения
index_depthиндексные записи дальше этого предела индексирования будут удалены,при увеличении значения
index_depthв индекс будут добавлены новые индексные записи.
Перестроение индекса key-value¶
Возможность принудительной переиндексации для индексов key-value пока не предусмотрена.
Индексы BRIN¶
Индексы BRIN (Block Range Index) предназначены для обработки больших таблиц, в которых значение в столбце имеет некоторую естественную корреляцию с физическим положением строки в таблице (например, временные метки создания записи). Иными словами, они эффективны, если запрос без ORDER BY выдает значения столбца в порядке возрастания или убывания, и столбец при этом не является индексируемым.
Таким образом, особенность этого типа индексов состоит не в том, чтобы быстро находить нужные строки, а в том, чтобы избегать просмотра заведомо ненужных строк. Чтение по индексу BRIN исключает те блоки хранения, в которых точно не будет какого-то значения, указанного в условии выборки, поскольку оно либо меньше минимального значения в блоке, либо больше максимального.
Особенности индексов BRIN в TCS¶
Индексы BRIN строятся на основе метаданных, которые сохраняются и пересчитываются для колонок в каждом блоке хранения:
min– минимальное значение в колонке,max– максимальное значение в колонке.
Пересчет и сохранение этих метаданных работает всегда, а вместо создания и удаления индекса BRIN задается только способ чтения – с использованием индекса BRIN или без.
Чтение с использованием индекса BRIN осуществляется автоматически для следующих случаев:
обработка запросов с условием типа
WHERE col BETWEEN $left AND $right,условия строгого равенства, но только для неиндексированных колонок.
Таким образом, чтение с использованием индекса BRIN по неупорядоченной неиндексированной колонке предполагает полное сканирование (full scan).
Индексы BRIN работают со следующими типами данных:
целочисленные (
i8,i16,i32,i64),временные метки (
ts),беззнаковые целые (
u8,u16,u32,u64),числа с плавающей точкой (
f32,f64).
Включение чтения по индексу BRIN¶
Чтобы включить чтение по индексу BRIN для некоторой колонки, в конфигурации данных для данной колонки нужно указать следующие параметры:
indexed со значением
false,brin_usedсо значениемtrue.
Например, здесь индекс BRIN построен по третьей колонке (created_at):
# tcs.yml
tcs:
block_size: 1024
default_column_values_limit: 20000
schema:
db:
public:
users:
columns:
- data_type: utf8
column_values_limit: 10000
name: id
index_depth: 10000
indexed: true
- data_type: utf8
column_values_limit: 1000
name: username
indexed: false
- data_type: ts
name: created_at
indexed: false
brin_used: true
Примечание
Если для колонки указано
indexed: trueиbrin_used: true, то при чтении по индексу с условием строгого равенства приоритет будет отдаваться индексу key-value, а не индексу BRIN.
Отключение чтения по индексу BRIN¶
Чтобы отключить чтение по индексу BRIN для некоторой колонки,
в конфигурации данных для соответствующей индексу колонки
нужно убрать параметр brin_used: true, либо явно указать brin_used: false.
После применения конфигурации запросы на чтение по данной колонке будут производиться
не по индексу BRIN.
Включение BRIN-фильтра¶
При включенном BRIN-фильтре TCS осуществляет чтение c полным сканированием (full scan), которое позволяет на раннем этапе отсеивать блоки, которые точно не включают в себя искомые записи. В отличие от обычного чтения по индексу BRIN, BRIN-фильтр не совершает предварительную выборку подходящих блоков. Это может сделать его более эффективным при выборке большого количества значений, а также может ускорить обработку запросов с условиями фильтрации по открытым интервалам. Рекомендуется экспериментально определять для каждого запроса, насколько подходит этот метод чтения.
Чтобы включить BRIN-фильтр, в заголовке запроса следует передать параметр x-tcs-brin_filter: true.
Этот параметр поддерживается для запросов по следующим HTTP-адресам:
/sql/streaming/sql/computation/run/exec/*
В результате BRIN-фильтр будет включен для всех числовых колонок в запросе,
для которых в конфигурации настроено indexed = false и brin_used = false.
Примечание
Возможность включить BRIN-фильтр для конкретной колонки не поддерживается в текущей версии TCS.
Совместное использование разных типов индексов¶
Возможно совместное использование разных типов индексов в запросе.
Например, есть таблица docs с двумя индексами:
индекс key-value по колонке
doc_num,индекс BRIN по колонке
created_at.
docs:
columns:
- indexed: true
data_type: utf8
name: doc_num
index_depth: 500
- indexed: false
brin_used: true
data_type: u64
name: created_at
index_depth: 10000
Следующий запрос использует оба этих индекса:
select
count(*)
from
docs
where
created_at between 1729520000 and <> 1729540000
and doc_num = '100-1-223';